function MapView(){
	//Importa archivos externos
	var MapModule = require('ti.map');
	
	var AnnotationType = require('ui/model/constants/AnnotationType');
	var PlayerConstants = require('ui/model/constants/PlayerConstants');
	
	var Player =  require('ui/model/Player');
	var Troop = require('ui/model/Troop');
	var Controller = require('ui/model/Controller');
	
	var PlayerView =  require('ui/common/PlayerView');
	var PlayerDetails = require('ui/common/PlayerDetails');
	var TroopView = require('ui/common/TroopView');
	var UnitDetails = require('ui/common/UnitDetails');
	var TankView = require('ui/common/TankView');
	var MotorcycleView = require('ui/common/MotorcycleView');
	
	var MapDetails = require('ui/common/MapDetails');
	
	//Variables
	//Inicia en el congreso de la nacion
	var _lat = -34.609791; //latitud
	var _long =  -58.392605; //longitud
		 
		
	//Obtiene la ubicación actual del dispositivo.
	//Obtiene la posición utilizando el WIFI o el GPS
	if (Titanium.Geolocation.locationServicesEnabled) {
		
		Ti.Geolocation.Android.manualMode = 'false'; // location updates are configured using the accuracy, frequency and preferredProvider properties in the Titanium.Geolocation module
		
		//Each location provider represents a different tradeoff between accuracy and battery power
		gpsProvider = Ti.Geolocation.Android.createLocationProvider({
    		name: Ti.Geolocation.PROVIDER_NETWORK, //Specifies the network location provider.
    		minUpdateTime: 60,  // Limits the frequency of location updates to no more than one per minUpdateTime seconds.
    		minUpdateDistance: 10 //Don't send location updates until the location changes at least minUpdateDistance meters.
		});
		
		//specify a location provider
		Ti.Geolocation.Android.addLocationProvider(gpsProvider);
		
		Titanium.Geolocation.getCurrentPosition(function(e) {
        	if (e.error) {
            	alert('Error: ' + e.error);
            } 
        	else {
        		_lat = e.coords.latitude;
        		_long = e.coords.longitude;
        	}
    	});
	}
	else{
		alert('Por favor, active los servicios de localización');
	}
	

	//ventana principal
	var self = Ti.UI.createWindow({
		backgroundColor:'#ffffff',
		navBarHidden:true,
		exitOnClose:false,
		controller:null
	});
	
	self.addEventListener('android:back', function(e) {
   		Ti.API.info("Log: Click to Back button!!!!");
   		Ti.App.controller = null;
   		
   		var toast = Ti.UI.createNotification({
		    message:"Cerrando aplicación",
    		duration: Ti.UI.NOTIFICATION_DURATION_LONG
		});
		toast.show();
		
   		self.close();
 	});
	
	/*
	//Vista derecha (Detalles del componente seleccionado)	
	var _detail = Ti.UI.createView({
		right:'0%',
		width: '30%',
		typeView :'_detail'	
	}); 
	*/
	
	//Vista del Mapa (panel izquierdo)
	var _map = MapModule.createView({
		left:'0%',
		width: '70%',
		mapType: MapModule.NORMAL_TYPE,  //Tipo de Vista del Mapa
		regionFit:true,
		userLocation: false, // A boolean that indicates if the map should show the user's current device location as a pin on the map.
		animate: true, //A boolean that indicates whether or not map actions, like opening and adding annotations, should be animated.	
		region: {latitude: _lat, longitude: _long, latitudeDelta: 0.005, longitudeDelta: 0.005 }, //This is an object that contains the four properties defining the visible area of the View. The same latitude and longitude of a region can be represented with a different level of zoom via the latitudeDelta and longitudeDelta properties 
		typeView :'_master',
		
		
		addElement : function (_element){
			
			var annotation = null;
			
			//Crear la vista del elemento en funcion de su tipo	
			switch(_element.type) {
    			case AnnotationType.ANNOTATION_TANK:
    				//Tropa del Tipo Tanque
    				annotation = new TankView(_element, this);
        			break;
    			case AnnotationType.ANNOTATION_MOTORCYCLE:
    				//tropa del Tipo Moto
    				annotation = new MotorcycleView(_element, this);
        			break;
        		case AnnotationType.ANNOTATION_TROOP:
        			//Tropa
        			 annotation = new TroopView(_element, this);
        			 break;
        		case AnnotationType.ANNOTATION_PLAYER:
        			//Jugador
        			 annotation = new PlayerView(_element, this);
        			break;
        	
        		case AnnotationType.ANNOTATION_COMMAND_CENTER:
        			//Centro de Comando
        		
        			break;
        		case AnnotationType.ANNOTATION_ENEMY_TANK:
    				//Tropa del Tipo Tanque del Enemigo
    				annotation = new TankView(_element, this);
        			break;
    			case AnnotationType.ANNOTATION_ENEMY_MOTORCYCLE:
    				//tropa del Tipo Moto del Enemigo
    				annotation = new MotorcycleView(_element, this);
        			break;
        		case AnnotationType.ANNOTATION_ENEMY_TROOP:
        			//Tropa del Enemigo
        			annotation = new TroopView(_element, this);
        			break;
        		case AnnotationType.ANNOTATION_ENEMY_PLAYER:
        			//Jugador Enemigo
        			annotation = new PlayerView(_element, this);
        			break;
        	
        		case AnnotationType.ANNOTATION_ENEMY_COMMAND_CENTER:
        			//Centro de Comando del Enemigo
        		
        			break;
        	}
        	
        	if (annotation != null){
        		this.addAnnotation(annotation);
        		_element.view = annotation;
        	}
		}
		
	});
	
	
	//Event Listener para el click sobre los distintos ANNOTATION
	//Muestra la ventana con el detalle y acciones del Annotation		
	Ti.App.addEventListener('clickAnnotation', function(evt){
    		
    		//Obtiene la lista de componetes que tiene la ventana
    		var _list = self.getChildren();
    		var _map;
    		
    		//Recorre la lista de componentes de la ventana
    		for (i = 0; i < _list.length; i++) {
    			
 				if (_list[i].typeView === '_detail'){
 				
 					//remueve la vista de detalle
 					self.remove(_list[i]);
 					//alert(lista[i].tipo);
 					
 				} else if (_list[i].typeView==='_master'){
 				
 					_map = _list[i];
 					
 				}
 			}


Colocar accion de ataque en funcion del annotation que desencadena la accion
La unidad del jugador selecciona la accion de atacar y luego el jugador hace clic sobre el enemigo
se le pasa al controller el annotation que representa al enemigo para que valide si
es factible el ataque. El controller previamente tiene la unidad del jugador que ataca

			if(evt.annotation.type===AnnotationType.ANNOTATION_PLAYER) {
    			//Agrega una nueva View con los datos del Jugador
    			var _detail = new PlayerDetails(evt.annotation, _map);
				self.add(_detail);
				
			} else if ((evt.annotation.type===AnnotationType.ANNOTATION_TROOP) || 
				(evt.annotation.type===AnnotationType.ANNOTATION_MOTORCYCLE) ||
				(evt.annotation.type===AnnotationType.ANNOTATION_TANK)){
									
				//Agrega una nueva View con los datos de la Unidad
				var _detail = new UnitDetails(evt.annotation, _map);
				self.add(_detail);
			}
	});
	
	
	//Event Listener para el click sobre el mapa
	//Muestra una vista con acciones sobre el juego.		
	Ti.App.addEventListener('clickMap', function(){
    		
    		//Obtiene la lista de componetes que tiene la ventana
    		var _list = self.getChildren();
    		var _map;
    		
    		//Recorre la lista de componentes de la ventana
    		for (i = 0; i < _list.length; i++) {
 				//Verifica el tipo de ventana
 				if (_list[i].typeView === '_detail'){
 					//Remueve el la ventana del tipo detalle
 					self.remove(_list[i]);
 				
 				} else if (_list[i].typeView==='_master'){
 				    //Obtiene la ventana del mapa
 					_map = _list[i];
 				
 				}
 			}
						
			//Agrera un nuevo View con los datos del Mapa
			var _detail = new MapDetails(self.controller, _map);
			
			self.add(_detail);
			
	});
	
	
	//Click sobre el mapa y sus componentes. Llama al EventListener correspondiente	
	_map.addEventListener('click', function(evt) {
	   	
	   	//Click sobre un Annotation
    	if(evt.clicksource=='pin'){
    		//Llama al evento clickAnnotation
    		Ti.App.fireEvent('clickAnnotation', { annotation: evt.annotation});
    	}
    	else{
    		//Click sobre el mapa
    		if(evt.clicksource==null){
    			//Llama al evento fireEvent_setActiveTab
    			Ti.App.fireEvent('clickMap');
    		}
    	}
	});
	
	
	//Drag and Drop de un Annotation
	_map.addEventListener('pinchangedragstate', function(evt) {
    	
    	
    	//newState == 0 inicio de Drag and Drop (agarrar)
    	//newState == 1 fin de Drag and Drop (soltar)
    	if (evt.newState == 1){
    		
    		//Ejecuta la accion cuando se suelta el objeto
    		if ((evt.annotation.type===AnnotationType.ANNOTATION_TROOP) || 
				(evt.annotation.type===AnnotationType.ANNOTATION_MOTORCYCLE) ||
				(evt.annotation.type===AnnotationType.ANNOTATION_TANK)) {
    		
    			evt.annotation.setNewLocation();
    		
    		/*
    			//Obtiene la lista de componetes que tiene la ventana
    			var _list = self.getChildren();
    			var _map;
    		
    			//Recorre la lista de componentes de la ventana
    			for (i = 0; i < _list.length; i++) {
	 				if (_list[i].typeView==='_master'){
 						_map = _list[i];
 					}
 				}
 			
 				if (evt.annotation.route != null){
 					_map.addRoute(evt.annotation.route);
 				}
 			*/
    		}
    	}
    	
	});
	
	
	//Crea el controlador si no existe
	var controller;
	
	if (Ti.App.controller==null){
		controller = new Controller();
	}
	else {
		controller = Ti.App.controller;
	}
	
	//Crea al Jugador
	var player = new Player(controller.getPlayerID(), controller.getPlayerName(), _lat, _long, PlayerConstants.PLAYER);
	//Establece la ubicacion del jugador en funcion de la posicion detectada por el dispositivo
	controller.playerSession.Ubicacion.Latitud = _lat;
	controller.playerSession.Ubicacion.Longitud = _long;
	
	_map.addElement(player);
			
	//Asigna el Jugador al Controlador
	controller.player =  player;
	
	//Asigna el Mapa al Controlador
	controller.map = _map;
	
	//Obtniene el oponenete luego de la carga del mapa y del jugador
	controller.setOpponent();
	
	//Asigna el controller al Global Scope
	Ti.App.controller = controller;
		
	//Detalle del Mapa
	var _detail = new MapDetails(controller, _map);
			
	self.add(_map);
	self.add(_detail);
	self.controller = controller;
	
	return self;
}

module.exports = MapView;
